assume cs:code
data segment
 db 0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0
 db 0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,0
 db 0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,1,1,0,1,0,0,1,1,0,0,0
 db 0,1,0,0,0,0,0,1,0,1,1,1,0,0,0,1,0,0,0,0,1,0,1,1,0,1,0,0,0,1,1,0,1,0,0,1,1,0,0,0
 db 0,1,0,0,0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,0,0,1,1,0,1,0,1,1,1,0,0,0
 db 1,1,0,0,1,0,0,1,0,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0,1,0,1,1,1,0,0,0
 db 1,1,0,0,1,0,0,1,0,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,1,1,1,0,0,0
 db 1,1,0,0,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,1,0,1,0,0,0,1,0,0,1,0,1,1,1,0,0,0
 db 1,1,0,0,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,1,0,1,0,0,0,1,0,1,1,0,1,1,1,0,0,0
 db 1,1,1,0,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0,1,1,0,1,0,0,0,1,0,1,1,0,1,1,1,0,0,0
 db 1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,0,1,1,1,0,1,0
 db 1,0,1,0,1,0,0,1,0,1,0,0,0,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,0,1,1,1,0
 db 1,0,1,0,1,0,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,1,1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,1,0
 db 1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,1,0,0,1,1,0
 db 1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,1,1,0
 db 0,0,1,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,1,0,1,0,0,0,1,1,0
 db 0,0,1,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,1,0,1,0,0,0,1,1,0
 db 0,0,1,1,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,1,0,1,0,0,0,1,1,0
 db 0,0,1,1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,1,1,0
 db 0,0,0,1,0,1,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,1,1,0
 db 0,0,0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0
 db 0,0,0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0
 db 0,0,0,1,0,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0
 db 0,0,0,1,0,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0
 db 0,0,0,1,0,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0
data ends
code segment
start:
     mov ax,data
     mov ds,ax
     mov ax,0b800h
     mov es,ax
     mov di,0
     mov cx,25
     mov bx,0
     mov bp,0
     s0:
      push cx
      mov cx,40
     s1:
        mov al,ds:[bp]
        cmp al,0
        je pass
        mov byte ptr es:[di],bl
        mov byte ptr es:[di+1],0ah
        mov byte ptr es:[di+78],bh
        mov byte ptr es:[di+79],0ah
        add bx,0101h
     pass:;mov byte ptr es:[di],' '
   ;mov byte ptr es:[di+78],' '
        inc bp
        add di,2
      loop s1

      add di,80
      pop cx
      loop s0

     mov cx,65535
     run_rain:
      call move_rain
      call delay_time
     loop run_rain

     mov ax,4c00h
     int 21h
;;;;;;;;;;;;;;;;;;;;;;;
move_rain:
    push dx
    push cx
    push bx
    push ax   
    push di
     mov di,0f9eh
     mov bx,0
     mov cx,25
  move_s0:
      push cx
      mov cx,80
  move_s1:
        mov al,ds:[di]
        cmp al,20h
        je  move_pass
        mov bx,es:[di]
        mov word ptr es:[di],0020h
        mov es:[di+160],bx
  move_pass:
      sub di,2
      loop move_s1
      pop cx
  loop move_s0

  mov cx,80
  first_line:
        mov bx,es:[di+4000]
        mov  word ptr es:[di+4000],0020h
        mov es:[di],bx
      add di,2
  loop first_line 
move_ok: pop di  
    pop ax
    pop bx
    pop cx
    pop dx 
ret
;;;;;;;延时函数;;;;;
delay_time:
push cx
		mov cx,0ffh
		run1:
		push cx
		mov cx,0ffh
		run2:
		loop run2
		pop cx
		loop run1
		pop cx
		ret
ret

code ends
end start